package modelo;

import java.util.Iterator;
import java.util.Observable;
import java.util.Vector;

public class Sistema extends Observable{

	
	private static Sistema sis;
	
	private Vector<Alumno> alumnos;
	private Vector<Profesor> profesores;
	private Vector<Materia> materias;
	private Vector<Curso> cursos;
	
	
	
	private Sistema (){
		alumnos = new Vector<Alumno>() ;
		profesores = new Vector<Profesor>() ;
		materias = new Vector<Materia>() ;
		cursos = new Vector<Curso>() ;
		
	}
	
	public static Sistema getIns(){
		
		if(sis == null)
			sis =  new Sistema();
		return sis;
		
		
	}
	
	
	//////////////// buscar ////////////////////////////////////////////
	
	public Alumno buscarAlumno(int leg){
		Alumno alumno = null;
		for(int i = 0; i<alumnos.size(); i++){
			Alumno aux = alumnos.elementAt(i);
			if(aux.getLegajo() == leg)
				alumno = aux;		
		}
		return alumno;	
	}
	
	public Profesor buscarProfesor(int leg){
		Profesor profesor = null;
		for(int i = 0; i<profesores.size(); i++){
			Profesor aux = profesores.elementAt(i);
			if(aux.getNroLegajo() == leg)
				profesor = aux;		
		}
		return profesor;	
	}
	
	public Materia buscarMateria(String num){
		Materia materia = null;
		for(int i = 0; i<materias.size(); i++){
			Materia aux = materias.elementAt(i);
			if(aux.getNumero().equalsIgnoreCase(num))
				materia = aux;		
		}
		return materia;	
	}
	
	public Curso buscarCurso(int num){
		Curso curso = null;
		for(int i = 0; i<cursos.size(); i++){
			Curso aux = cursos.elementAt(i);
			if(aux.getNumeroCurso()== num)
				curso = aux;		
		}
		return curso;	
	}
	
	//////////////////////// existe  /////////////////////////////////////////////////
	
	public boolean existeAlumno(int leg ){
		
		if(buscarAlumno(leg)== null)
			return false;
		else
			return true;	
	}
	
	public boolean existeMateria(String num ){
		
		if(buscarMateria(num)== null)
			return false;
		else
			return true;
	}
	
	public boolean existeProfesor(int leg ){
		
		if(buscarProfesor(leg)== null)
			return false;
		else
			return true;
	}
	
	public boolean existeCurso(int nro){/////////////////////////////
		
		boolean salida = false;
		for(int i = 0; i<cursos.size(); i++){
			Curso aux = cursos.elementAt(i);
			if(aux.getNumeroCurso()==nro)
				salida  = true;		
		}
		return salida;
		
	}
	
	public boolean existeCurso(String nroMat, int legProf){
		
		boolean salida = false;
		for(int i = 0; i<cursos.size(); i++){
			Curso aux = cursos.elementAt(i);
			if(aux.getMateria().getNumero().equalsIgnoreCase(nroMat)&& aux.getProfesor().getNroLegajo()==legProf)
				salida  = true;		
		}
		return salida;
		
	}
	
	public boolean existeCursoConMateria(String nroMat){
		
		boolean salida = false;
		for(int i = 0; i<cursos.size(); i++){
			Curso aux = cursos.elementAt(i);
			if(aux.getMateria().getNumero().equalsIgnoreCase(nroMat))
				salida  = true;		
		}
		return salida;
		
	}
	
	public boolean existeCursoConProfesor(int legProf){
		
		boolean salida = false;
		for(int i = 0; i<cursos.size(); i++){
			Curso aux = cursos.elementAt(i);
			if(aux.getProfesor().getNroLegajo()==legProf)
				salida  = true;		
		}
		return salida;
		
	}
	
	public boolean existeProfesorConMateria(String nroMat){
		
		boolean salida = false;
		for(int i = 0; i<profesores.size(); i++){
			 Profesor aux = profesores.elementAt(i);
			if(aux.existeMateria(nroMat))
				salida  = true;		
		}
		return salida;
		
	}
	
	
	public boolean existeCursoConAlumno(int nroAlumno){
		
		boolean salida = false;
		for(int i = 0; i<cursos.size(); i++){
			 Curso c = cursos.elementAt(i);
			if(c.existeAlumno(nroAlumno))
				salida  = true;		
		}
		return salida;
		
	}
	
	
	/////////////////////////////  guardar  ////////////////////////////////////////////
	
	public void guardarAlumno(Alumno a){
		
		int n = -1;
		for (int i = 0; i < alumnos.size(); i ++){
			if (a.getLegajo()> alumnos.elementAt(i).getLegajo())
				n = i;			
		}
		alumnos.add(n + 1, a);
		//////// observable /////////////////
		this.setChanged();      // Indica que hubo un cambio
		this.notifyObservers(); // Avisa a los observers
		                
}	
	
	public void guardarProfesor(Profesor p){
		
		int n = -1;
		for (int i = 0; i < profesores.size(); i ++){
			if (p.getNroLegajo()> profesores.elementAt(i).getNroLegajo())
				n = i;			
		}
		profesores.add(n + 1, p);
		this.setChanged();
		this.notifyObservers();
		                
	}
	
	public void guardarMateria(Materia m){
		
		int n = -1;
		for (int i = 0; i < materias.size(); i ++){
			if ((m.getNumero().compareToIgnoreCase(materias.elementAt(i).getNumero())) > 0)
				n = i;			
		}
		materias.add(n + 1, m);
		this.setChanged();
		this.notifyObservers();
}	
	
	
	public void guardarCurso(Curso c){
		
		cursos.add(c);
		this.setChanged();
		this.notifyObservers();
	}
	
	///////////////////////  actualizar ///////////////////////////////////////
	
    public void actualizarAlumno(Alumno a){
		
    	for(int i = 0; i<alumnos.size(); i++){
			Alumno aux = alumnos.elementAt(i);
			if(aux.getLegajo()== a.getLegajo()){
				alumnos.set(i, a);	
			}
		}
    	this.setChanged();
		this.notifyObservers();
	}
	
	public void actualizarProfesor(Profesor p){
		
		for(int i = 0; i<profesores.size(); i++){
			Profesor aux = profesores.elementAt(i);
			if(aux.getNroLegajo()== p.getNroLegajo()){
				profesores.set(i, p);	
			}
		}
		this.setChanged();
		this.notifyObservers();
	}

	
	public void actualizarMateria(Materia m){
		
		for(int i = 0; i<materias.size(); i++){
			Materia aux = materias.elementAt(i);
			if(aux.getNumero().equalsIgnoreCase(m.getNumero())){
				materias.set(i, m);	
			}
		}
		this.setChanged();
		this.notifyObservers();
}	
	
	public void actualizarCurso(Curso c){
		
		for(int i = 0; i<cursos.size(); i++){
			Curso aux = cursos.elementAt(i);
			if(aux.getNumeroCurso() == c.getNumeroCurso()){
				cursos.set(i, c);	
			}
		}
		this.setChanged();
		this.notifyObservers();
	}
	
	
	///////////////////////  eliminar  //////////////////////////////////////////
	
	public void eliminarAlumno(Alumno a){
		
		alumnos.remove(a);
		this.setChanged();
		this.notifyObservers();
	}
	
	public void eliminarProfesor(Profesor p){
		
		profesores.remove(p);
		this.setChanged();
		this.notifyObservers();
	}
	
	public void eliminarMateria(Materia m){
		
		materias.remove(m);
		this.setChanged();
		this.notifyObservers();
	}
	
	public void eliminarCurso(Curso c){
		
		cursos.remove(c);
		this.setChanged();
		this.notifyObservers();
	}
	
	///////////////////////////// asignar  //////////////////////////////////
	
	public void asignarAlumnoCurso(Curso c, Alumno a){
		
		c.agregarAlumno(a);
		guardarCurso(c);
		
	}
	
	public void asignarMateriaProfesor(Materia m, Profesor p){
		
		p.agregarMateria(m);
		guardarProfesor(p);
		
	}
	
	////////////////////// listar ///////////////////////////////////////////
	
	public Vector <Object> listarMaterias(){

		Vector<Object> salida = new Vector<Object>();
		
		for (Iterator <Materia> iter = materias.iterator(); iter.hasNext();) {
			Materia m = (Materia)iter.next();
			salida.add(m.toVector());			
		}
		return  salida;
	}
	
	public Vector <Object> listarMateriasProfesor(){

		Vector<Object> salida = new Vector<Object>();
		
		for (Iterator <Materia> iter = materias.iterator(); iter.hasNext();) {
			Materia m = (Materia)iter.next();
			salida.add(m.toVector());			
		}
		return  salida;
	}
	
	public Vector <Object> listarAlumnos(){

		Vector<Object> salida = new Vector<Object>();
		
		for (Iterator <Alumno> iter = alumnos.iterator(); iter.hasNext();) {
			Alumno a = (Alumno)iter.next();
			salida.add(a.toVector());			
		}
		return  salida;
	}
	
	public Vector <Object> listarProfesores(){

		Vector<Object> salida = new Vector<Object>();
		
		for (Iterator <Profesor> iter = profesores.iterator(); iter.hasNext();) {
			Profesor p = (Profesor)iter.next();
			salida.add(p.toVector());			
		}
		return  salida;
	}
	
	public Vector <Object> listarCursos(){

		Vector<Object> salida = new Vector<Object>();
		
		for (Iterator <Curso> iter = cursos.iterator(); iter.hasNext();) {
			Curso c = (Curso)iter.next();
			salida.add(c.toVector());			
		}
		return  salida;
	}
	

	///////////// getters //////////////////////////////////////////
	
	public Vector<Materia> getMaterias() {
		
    Vector<Materia> salida = new Vector<Materia>();
		
		for (Iterator <Materia> iter = materias.iterator(); iter.hasNext();) {
			salida.add((Materia)iter.next());		
		}
		return  salida;
	}
	
	public Vector<Alumno> getAlumnos() {
		
	    Vector<Alumno> salida = new Vector<Alumno>();
			
			for (Iterator <Alumno> iter = alumnos.iterator(); iter.hasNext();) {
				salida.add((Alumno)iter.next());		
			}
			return  salida;
		}
	
}